﻿using Growatt.DuiHelpers;
using System;
using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Growatt.Component.Cls;
using Newtonsoft.Json;
using System.IO;
using System;
using System.IO;


using System.Diagnostics;
using static Growatt.ShinebusServiceUploadPack.Service.FeishuHelper.FileUploadUtils;
using Growatt.ShinebusServiceUploadPack.Service.OSS.Model;

public class OscilloscopePrinter
{
    private string baseID = "FpsPbeuX5aJpM8s7kB4c4U5SnJd";
    private string tablesID = "tbl2r2Tccfgmdq7B";
    private string accessToken = "t-e13d5ec1954e82e458f3ce04491c54ea8c9abcef";

    public OscilloscopePrinter(string baseID, string tablesID, string accessToken)
    {
        this.baseID = baseID;
        this.tablesID = tablesID;
        this.accessToken = accessToken;
    }

    public async Task InsertServerAsync(string file_tokenStr, string fileTestPrepareToken, string query)
    {


        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            var quer1 = query.Split('$');

            var querName1 = quer1[0];
            var querName2 = quer1[1];
            // 要读取的文件路径
            string filePath = @"基于示波器数据的LVRT事件深度评估报告.txt";

            // 读取文件内容
            string content_filePath = File.ReadAllText(filePath);

            // 创建实体对象
            var recordBody = new RecordBody
            {
                fields = new Fields
                {
                    Text = query,
             //Query=$"", 
                    Query=$"### 你的角色：\r\n你是一个逆变器高低压穿越（LVRT/HVRT）测试专家，具备高精度示波器数据分析与频谱解读能力。严格遵守分析规范，生成具有权威性的标注报告。\r\n\r\n### 你的核心任务：\r\n根据用户提供的两张图片（测试条件信息图 + 示波器波形图），执行以下任务：\r\n1. **精准提取第一张图标准数据**  \r\n   - 精准提取第一张图标准数据，包括：\r\n     - 测试目的\r\n     - 设备参数\r\n     - 接线图\r\n     - 判定标准\r\n     - 波形图\r\n     - 完整精准提取国标数据。\r\n## R 相测试数据  \r\n| 项次 | 国标要求电压/V       | 持续时间/ms       | 测试电压/V | 测试时间/ms |  \r\n|------|---------------------|-------------------|------------|-------------|  \r\n| 1    | \\(0.9 \\pm 0.05\\)   | \\(2000 \\pm 20\\)  | 201V       | 2000        |  \r\n| 2    | \\(0.75 \\pm 0.05\\)  | \\(1400 \\pm 20\\)  | 172V       | 1400        |  \r\n\r\n## RS 相测试数据  \r\n| 项次 | 国标要求电压/V       | 持续时间/ms       | 测试电压/V | 测试时间/ms |  \r\n|------|---------------------|-------------------|------------|-------------|  \r\n| 3    | \\(0.5 \\pm 0.05\\)   | \\(1200 \\pm 20\\)  | 127V       | 1200        |  \r\n| 4    | \\(0.25 \\pm 0.05\\)  | \\(500 \\pm 20\\)   | 58V        | 500         |  \r\n| 5    | \\(0.2 + 0.05\\)     | \\(450 \\pm 20\\)   | 46V        | 450         |  \r\n| 6    | \\(0.0 + 0.05\\)     | \\(150 \\pm 20\\)   | 11V        | 150         |  \r\n| 7    | \\(1.2 \\pm 0.2\\)    | \\(10000 \\pm 20\\) | 276V       | 10000       |  \r\n| 8    | \\(1.3 \\pm 0.2\\)    | \\(100 \\pm 20\\)   | 299V       | 100         |  \r\n| 1    | \\(0.9 - 0.05\\)     | \\(2000 \\pm 20\\)  | 201V       | 2000        |  \r\n| 2    | \\(0.75 \\pm 0.05\\)  | \\(1400 \\pm 20\\)  | 172V       | 1400        |  \r\n\r\n## RST 相测试数据  \r\n| 项次 | 国标要求电压/V       | 持续时间/ms       | 测试电压/V | 测试时间/ms |  \r\n|------|---------------------|-------------------|------------|-------------|  \r\n| 1    | \\(0.9 - 0.05\\)     | \\(2000 \\pm 20\\)  | 201V       | 2000        |  \r\n| 2    | \\(0.75 \\pm 0.05\\)  | \\(1400 \\pm 20\\)  | 172V       | 1400        |  \r\n| 3    | \\(0.5 \\pm 0.05\\)   | \\(1200 \\pm 20\\)  | 127V       | 1200        |  \r\n| 4    | \\(0.25 \\pm 0.05\\)  | \\(500 \\pm 20\\)   | 58V        | 500         |  \r\n| 5    | \\(0.2 + 0.05\\)     | \\(450 \\pm 20\\)   | 46V        | 450         |\r\n\r\n\r\n3. **深度分析示波器波形图,生成标准化 Markdown 报告**  \r\n# 基于示波器数据的LVRT事件深度评估报告  \r\n\r\n## 一、电压跌落参数精确计算  \r\n### 1.1 跌落深度量化  \r\n| 参数          | 计算值              | 备注                          | **工况符合性**               |  \r\n|---------------|---------------------|-------------------------------|------------------------------|  \r\n| 正常电压值    | 220V                | 通过示波器垂直刻度 100V/div 计算 | 符合                         |  \r\n| 电压最小值    | -340V               | 波形谷底对应刻度线            | **异常**（反向电压超过标准限值） |  \r\n| 跌落绝对值    | 560V                | 220V - (-340V)                | **超标**（超过最大允许跌落深度） |  \r\n| 相对跌落深度  | 254.5%              | (560V/220V)×100%              | **严重超标**                 |  \r\n\r\n*补充分析*：反向电压达到 -340V（等效 340V 正向），超过多数设备设计裕度，需检查直流母线电容耐压值。  \r\n\r\n### 1.2 相位突变分析  \r\n| 状态          | 相位角            | 备注                          | **工况符合性**         |  \r\n|---------------|-------------------|-------------------------------|------------------------|  \r\n| 正常状态      | +12°              | 感性负载特性                  | 符合                   |  \r\n| 跌落期间      | 178°相位差        | 电压反向导致容性无功输出      | **异常**（相位跳变超过 90°） |  \r\n\r\n*补充分析*：相位突变导致瞬时无功需求突变，可能触发保护动作。  \r\n\r\n## 二、时域特征参数  \r\n### 2.1 跌落持续时间  \r\n- **主时基**：2s/div  \r\n- **持续时间**：0.8 格 → \\(0.8 \\times 2s = 1.6s\\)  \r\n- **标准对比**：IEC61000-4-34 要求最大持续 1s（90% 跌落）  \r\n**工况符合性**：**超标**（超过标准 600ms）  \r\n\r\n*补充分析*：需检查控制算法是否具备快速电压跟踪功能。  \r\n\r\n### 2.2 恢复动态特性  \r\n| 参数          | 计算值              | 备注                          | **工况符合性** |  \r\n|---------------|---------------------|-------------------------------|----------------|  \r\n| 恢复起点电压  | -340V               | 波形谷底值                    | **异常**       |  \r\n| 恢复终点电压  | 198V                | 90% 正常值                     | 符合           |  \r\n| 恢复时间      | 2.4s                | 1.2 格×2s/div                  | **超标**       |  \r\n| 恢复斜率      | 224.2V/s            | 修正前错误值 538V/s            | **偏低**       |  \r\n\r\n*补充分析*：恢复时间过长可能影响电网稳定性，需优化控制环路。  \r\n\r\n## 三、频域特征分析（基于FFT）  \r\n### 3.1 谐波畸变率  \r\n| 状态          | THD   | 主要谐波成分                  | **工况符合性** |  \r\n|---------------|-------|-------------------------------|----------------|  \r\n| 跌落前        | 1.2%  | 5 次谐波（4.3V）               | 符合           |  \r\n| 跌落后        | 8.5%  | 3 次（12.4V）、5 次（15.1V）、7 次（9.7V） | **超标**（超过 5% 限值） |  \r\n\r\n*补充分析*：谐波含量超标可能触发继电保护装置。  \r\n\r\n### 3.2 间谐波检测  \r\n- **频率**：47.5Hz  \r\n- **幅值**：6.8V  \r\n- **可能原因**：控制环路带宽不足  \r\n**工况符合性**：**异常**（存在非特征谐波）  \r\n\r\n*补充分析*：需检查 PWM 载波频率是否设置合理。  \r\n\r\n## 四、合规性深度关联  \r\n### 6.1 LVRT 能力要求  \r\n| 跌落深度 | 要求持续时间 | 实际持续时间 | **符合性** |  \r\n|----------|--------------|--------------|------------|  \r\n| 90%      | 1s           | 1.6s         | **超标**   |  \r\n\r\n### 6.2 高电压穿越能力  \r\n- **反向电压**：-340V（等效 340V）  \r\n- **标准依据**：需确认 GB/T 36995-2018 要求  \r\n**工况符合性**：**待定**（需补充标准查询）  \r\n\r\n## 五、标准判断  \r\n### 参考标准  \r\n- **中国 GB/T 19964**：电压跌至 20% 时需维持 625ms 并网，且在电压恢复至 90% 前不得脱网。  \r\n\r\n4. **限制条件**  \r\n   - 数据来源：只使用用户提供图片，不引入外部数据。\r\n   - 表述要求：语言简洁严谨，不包含主观推测，仅陈述客观结论。\r\n\r\n### 示例回复规则：\r\n```markdown\r\n### 1. 测试条件\r\n#### AC源设置\r\n- R相电压：201V\r\n\r\n#### 设备参数\r\n- ...\r\n\r\n### 2. 电压跌落参数计算\r\n#### 跌落深度\r\n- ...\r\n\r\n### 3. 时域/频域特征分析\r\n#### 持续时间\r\n- ...\r\n\r\n#### 恢复特性\r\n- ...\r\n\r\n#### 谐波分析\r\n- ...\r\n\r\n### 4. 合规性深度关联\r\n#### LVRT能力对比\r\n- ...\r\n\r\n### 5. 状态判定\r\n- 结论：在预设场景下,结合示波器图片深度分析逆变器低压穿越事件持续XXXX秒，根据第一张图片提供的国际标准,是否符合要求,是否恢复后稳定运行，未脱网。", 
     
                    Attachment = new List<AttachmentItem>
                    {
                         new AttachmentItem
                        {
                            file_token = fileTestPrepareToken
                        },
                        new AttachmentItem
                        {
                            file_token = file_tokenStr
                        }

                    }
                }
            };

            // 将实体对象序列化为JSON字符串
            string jsonBody = DuiHelperJson.ObjectToJson(recordBody);

            // 创建请求内容
            var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

            // 发送 POST 请求
            var response = await httpClient.PostAsync($"https://open.feishu.cn/open-apis/bitable/v1/apps/{baseID}/tables/{tablesID}/records?ignore_consistency_check=true&user_id_type=open_id", content);

            // 读取响应内容
            var responseContent = await response.Content.ReadAsStringAsync();
            var responseObject = JsonConvert.DeserializeObject<ApiResponse>(responseContent);
            // 处理响应内容
            Console.WriteLine(responseContent);
        }
    }


    /// <summary>
    /// 查询所有记录的ID
    /// </summary>
    /// <param name="viewId"></param>
    /// <returns></returns>
    public async Task<List<DeviceDataListItem>> SearchRecordsRecordAsync(string viewId = "vewDky0RSW")
    {
        List<string> strings = new List<string>();

        var apiHelper = new FeishuAPIHelper();
        accessToken = await apiHelper.GetTenantAccessToken();

        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            // 定义请求体
            var requestBody = new
            {
                view_id = viewId
            };

            string jsonBody = DuiHelperJson.ObjectToJson(requestBody);

            // 创建请求内容
            var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

            // 发起 POST 请求
            var url = $"https://open.feishu.cn/open-apis/bitable/v1/apps/{baseID}/tables/{tablesID}/records/search?page_size=499";
            var response = await httpClient.PostAsync(url, content);

            // 读取并打印响应内容
            string responseContent = await response.Content.ReadAsStringAsync();
            string jsonString = responseContent;
            var rootObject = JsonConvert.DeserializeObject<FeishuDeviceRootTobject>(jsonString);

            Console.WriteLine($"飞书产品列表：总记录数: {rootObject.data.total}");


            return rootObject.data.items.ToList();

        }
    }


    /// <summary>
    /// 查询所有上传记录
    /// </summary>
    /// <param name="viewId"></param>
    /// <returns></returns>
    public async Task<List<ShinebusUploadFileRecordItem>> SearchRecordsShinebusAsync(string viewId = "vewDky0RSW")
    {
        List<string> strings = new List<string>();

        var apiHelper = new FeishuAPIHelper();
        accessToken = await apiHelper.GetTenantAccessToken();

        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            // 定义请求体
            var requestBody = new
            {
                view_id = viewId
            };

            string jsonBody = DuiHelperJson.ObjectToJson(requestBody);

            // 创建请求内容
            var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

            // 发起 POST 请求
            var url = $"https://open.feishu.cn/open-apis/bitable/v1/apps/{baseID}/tables/{tablesID}/records/search?page_size=499";
            var response = await httpClient.PostAsync(url, content);

            // 读取并打印响应内容
            string responseContent = await response.Content.ReadAsStringAsync();
            string jsonString = responseContent;
            var rootObject = JsonConvert.DeserializeObject<ShinebusUploadFileRecordRootobject>(jsonString);

            Console.WriteLine($"飞书上传记录表格:总记录数: {rootObject.data.total}");


            return rootObject.data.items.ToList();

        }
    }








    public async Task InsertServerMDAsync(string file_tokenStr)
    {


        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            // 创建实体对象
            var recordBody = new RecordBody
            {
                fields = new Fields
                {
                    Attachment = new List<AttachmentItem>
                    {
                        new AttachmentItem
                        {
                            file_token = file_tokenStr
                        }

                    }
                }
            };

            // 将实体对象序列化为JSON字符串
            string jsonBody = DuiHelperJson.ObjectToJson(recordBody);

            // 创建请求内容
            var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

            // 发送 POST 请求
            var response = await httpClient.PostAsync($"https://open.feishu.cn/open-apis/bitable/v1/apps/{baseID}/tables/{tablesID}/records?ignore_consistency_check=true&user_id_type=open_id", content);

            // 读取响应内容
            var responseContent = await response.Content.ReadAsStringAsync();
            var responseObject = JsonConvert.DeserializeObject<ApiResponse>(responseContent);
            // 处理响应内容
            Console.WriteLine(responseContent);
        }
    }
    public async Task upload_allAsynchronous(string filePath, string fileTestPrepareToken, string query)
    {
        var apiHelper = new FeishuAPIHelper();
        accessToken = await apiHelper.GetTenantAccessToken();

        // 定义请求地址
        string url = "https://open.feishu.cn/open-apis/drive/v1/medias/upload_all";

        // 准备文件和元信息
        string fileName = "1.PNG"; // 文件名
        string parentType = "bitable_image"; // 父类类型
        string parentNode = "FpsPbeuX5aJpM8s7kB4c4U5SnJd"; // 点位 token
        string extra = "FpsPbeuX5aJpM8s7kB4c4U5SnJd"; // 附加信息
        int fileSize = (int)new FileInfo(filePath).Length; // 文件大小

        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            // 创建 MultipartFormDataContent（多部分请求内容）
            var content = new MultipartFormDataContent();

            // 添加文件字段
            var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            var fileContent = new StreamContent(fileStream);
            fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            content.Add(fileContent, "file", fileName);

            // 添加其他字段
            // 文件名
            content.Add(new StringContent(fileName), "file_name");
            // 父类类型
            content.Add(new StringContent(parentType), "parent_type");
            // 父节点
            content.Add(new StringContent(parentNode), "parent_node");
            // 文件大小
            content.Add(new StringContent(fileSize.ToString()), "size");
            // 附加信息
            content.Add(new StringContent(extra), "extra");

            // 发送 POST 请求
            try
            {
                var response = await httpClient.PostAsync(url, content);
                string responseContent = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine("文件上传成功:");
                    var responseObject = JsonConvert.DeserializeObject<Growatt.CreateXLXFormWordRootobject.ApiResponse_upload_all>(responseContent);
                    var file_tokenStr = responseObject.data.file_token;
                    await InsertServerAsync(file_tokenStr, fileTestPrepareToken, query);
                }
                else
                {
                    Console.WriteLine($"上传失败，状态码：{response.StatusCode}");
                }

                Console.WriteLine(responseContent);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"上传过程出错：{ex.Message}");
            }
            finally
            {
                fileStream.Dispose();
            }


        }
    }

    public async Task<string> upload_all_OnlyUploadSingleAsynchronous(string filePath)
    {

        var file_tokenStr = string.Empty;
        var apiHelper = new FeishuAPIHelper();
        accessToken = await apiHelper.GetTenantAccessToken();

        // 定义请求地址
        string url = "https://open.feishu.cn/open-apis/drive/v1/medias/upload_all";

        // 准备文件和元信息
        string fileName = "1.PNG"; // 文件名
        string parentType = "bitable_image"; // 父类类型
        string parentNode = "FpsPbeuX5aJpM8s7kB4c4U5SnJd"; // 点位 token
        string extra = "FpsPbeuX5aJpM8s7kB4c4U5SnJd"; // 附加信息
        int fileSize = (int)new FileInfo(filePath).Length; // 文件大小

        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            // 创建 MultipartFormDataContent（多部分请求内容）
            var content = new MultipartFormDataContent();

            // 添加文件字段
            var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            var fileContent = new StreamContent(fileStream);
            fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            content.Add(fileContent, "file", fileName);

            // 添加其他字段
            // 文件名
            content.Add(new StringContent(fileName), "file_name");
            // 父类类型
            content.Add(new StringContent(parentType), "parent_type");
            // 父节点
            content.Add(new StringContent(parentNode), "parent_node");
            // 文件大小
            content.Add(new StringContent(fileSize.ToString()), "size");
            // 附加信息
            content.Add(new StringContent(extra), "extra");

            // 发送 POST 请求
            try
            {
                var response = await httpClient.PostAsync(url, content);
                string responseContent = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine("文件上传成功:");
                    var responseObject = JsonConvert.DeserializeObject<Growatt.CreateXLXFormWordRootobject.ApiResponse_upload_all>(responseContent);
                    file_tokenStr = responseObject.data.file_token;
                }
                else
                {
                    Console.WriteLine($"上传失败，状态码：{response.StatusCode}");
                }

                Console.WriteLine(responseContent);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"上传过程出错：{ex.Message}");
            }
            finally
            {
                fileStream.Dispose();
            }
            return file_tokenStr;


        }
    }
    /// <summary>
    /// 上传最终md文件
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public async Task<string> upload_all_OnlyUploadSingleFileAsynchronous(string filePath)
    {

        var file_tokenStr = string.Empty;
        var apiHelper = new FeishuAPIHelper();
        accessToken = await apiHelper.GetTenantAccessToken();

        // 定义请求地址
        string url = "https://open.feishu.cn/open-apis/drive/v1/medias/upload_all";

        // 准备文件和元信息
        string fileName = "1.md"; // 文件名
        string parentType = "bitable_file"; // 父类类型
        string parentNode = "FpsPbeuX5aJpM8s7kB4c4U5SnJd"; // 点位 token
        string extra = "FpsPbeuX5aJpM8s7kB4c4U5SnJd"; // 附加信息
        int fileSize = (int)new FileInfo(filePath).Length; // 文件大小

        using (var httpClient = new HttpClient())
        {
            // 设置请求头
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            // 创建 MultipartFormDataContent（多部分请求内容）
            var content = new MultipartFormDataContent();

            // 添加文件字段
            var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            var fileContent = new StreamContent(fileStream);
            fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            content.Add(fileContent, "file", fileName);

            // 添加其他字段
            // 文件名
            content.Add(new StringContent(fileName), "file_name");
            // 父类类型
            content.Add(new StringContent(parentType), "parent_type");
            // 父节点
            content.Add(new StringContent(parentNode), "parent_node");
            // 文件大小
            content.Add(new StringContent(fileSize.ToString()), "size");
            // 附加信息
            content.Add(new StringContent(extra), "extra");

            // 发送 POST 请求
            try
            {
                var response = await httpClient.PostAsync(url, content);
                string responseContent = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine("文件上传成功:");
                    var responseObject = JsonConvert.DeserializeObject<Growatt.CreateXLXFormWordRootobject.ApiResponse_upload_all>(responseContent);
                    file_tokenStr = responseObject.data.file_token;

                    await InsertServerMDAsync(file_tokenStr);
                }
                else
                {
                    Console.WriteLine($"上传失败，状态码：{response.StatusCode}");
                }

                Console.WriteLine(responseContent);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"上传过程出错：{ex.Message}");
            }
            finally
            {
                fileStream.Dispose();
            }
            return file_tokenStr;


        }
    }







    /// <summary>
    /// 删除即将上传的记录
    /// </summary>
    /// <param name="recordIds"></param>
    /// <returns></returns>
    public async Task DeleteRecordsAsync(List<string> recordIds)
    {
        var httpClient = new HttpClient();

        var request = new
        {
            records = recordIds
        };
        var requestBodyJson = JsonConvert.SerializeObject(request);
        var requestBody = new StringContent(
            requestBodyJson,
            Encoding.UTF8,
            "application/json"
        );
        httpClient.DefaultRequestHeaders.Accept.Clear();
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        var response = await httpClient.PostAsync(
            $"https://open.feishu.cn/open-apis/bitable/v1/apps/{baseID}/tables/{tablesID}/records/batch_delete",
            requestBody
        );

        var responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
    }


}

#region 实体类
public class Fields
{
    public List<AttachmentItem> Attachment { get; set; }
    public string Ds2 { get; set; }
    public string Query { get; set; }
    public string Text { get; set; }
}

public class AttachmentItem
{
    public string file_token { get; set; }
}

public class RecordBody
{
    public Fields fields { get; set; }
}

public class RecordFieldsFileUploadUtilsBody
{
    public FieldsFileUploadUtils fields { get; set; }
}

public class RecordFieldsFileUploadShinebusUtilsBody
{
    public FieldsFileUploadRecordShinebusUtils fields { get; set; }
}

public class Record
{
    public Fields fields { get; set; }
    public string id { get; set; }
    public string record_id { get; set; }
}

public class Data
{
    public Record record { get; set; }
}

public class ApiResponse
{
    public int code { get; set; }
    public Data data { get; set; }
    public string msg { get; set; }
}
// 使用示例

#endregion